package com.ruoyi.project.system.mapper;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.project.system.domain.SysMenu;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

/**
 * 菜单表 数据层
 * 
 * @author ruoyi
 */
public interface SysMenuMapper extends Mapper<SysMenu>
{
    /**
     * 查询系统菜单列表
     * 
     * @param menu 菜单信息
     * @return 菜单列表
     */
    default List<SysMenu> selectMenuList(SysMenu menu) {
        Example example = new Example(SysMenu.class);
        Example.Criteria criteria = example.createCriteria();
        if (StringUtils.isNotEmpty(menu.getMenuName())) {
            criteria.andLike("menuName", "%" + menu.getMenuName() + "%");
        }
        if (StringUtils.isNotEmpty(menu.getVisible())) {
            criteria.andEqualTo("visible", menu.getVisible());
        }
        if (StringUtils.isNotEmpty(menu.getStatus())) {
            criteria.andEqualTo("status", menu.getStatus());
        }
        example.orderBy("parentId").orderBy("orderNum");
        return selectByExample(example);
    }

    /**
     * 根据用户所有权限
     * 
     * @return 权限列表
     */
    List<String> selectMenuPerms();

    /**
     * 根据用户查询系统菜单列表
     * 
     * @param menu 菜单信息
     * @return 菜单列表
     */
    List<SysMenu> selectMenuListByUserId(SysMenu menu);

    /**
     * 根据用户ID查询权限
     * 
     * @param userId 用户ID
     * @return 权限列表
     */
    List<String> selectMenuPermsByUserId(Long userId);

    /**
     * 根据用户ID查询菜单
     * 
     * @return 菜单列表
     */
    default List<SysMenu> selectMenuTreeAll() {
        Example example = new Example(SysMenu.class);
        example.createCriteria()
                .andIn("menuType", Arrays.asList("M", "C"))
                .andEqualTo("status", "0");
        example.orderBy("parentId").orderBy("orderNum");
        return selectByExample(example);
    }

    /**
     * 根据用户ID查询菜单
     * 
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SysMenu> selectMenuTreeByUserId(Long userId);

    /**
     * 根据角色ID查询菜单树信息
     * 
     * @param roleId 角色ID
     * @return 选中菜单列表
     */
    List<Integer> selectMenuListByRoleId(Long roleId);

    /**
     * 是否存在菜单子节点
     * 
     * @param menuId 菜单ID
     * @return 结果
     */
    default int hasChildByMenuId(Long menuId) {
        Example example = new Example(SysMenu.class);
        example.createCriteria().andEqualTo("parentId", menuId);
        return selectCountByExample(example);
    }

    /**
     * 新增菜单信息
     * 
     * @param menu 菜单信息
     * @return 结果
     */
    default int insertMenu(SysMenu menu) {
        menu.setCreateTime(new Date());
        return insertSelective(menu);
    }

    /**
     * 修改菜单信息
     * 
     * @param menu 菜单信息
     * @return 结果
     */
    default int updateMenu(SysMenu menu) {
        menu.setUpdateTime(new Date());
        return updateByPrimaryKeySelective(menu);
    }

    /**
     * 校验菜单名称是否唯一
     * 
     * @param menuName 菜单名称
     * @param parentId 父菜单ID
     * @return 结果
     */
    default SysMenu checkMenuNameUnique(String menuName, Long parentId) {
        Example example = new Example(SysMenu.class);
        example.createCriteria()
                .andEqualTo("menuName", menuName)
                .andEqualTo("parentId", parentId);
        return selectOneByExample(example);
    }
}
